/*
 * @Description: file content
 * @Author: ZeT1an
 * @Date: 2022-01-10 15:03:14
 * @LastEditors: ZeT1an
 * @LastEditTime: 2022-01-10 15:58:18
 * @LastEditContent: 
 */
/**
 * JS中函数作为第一公民的两个特征
 * 1.JS中函数使用非常灵活
 * 2.再JS中，函数既可以作为一个函数的参数，也可以作为一个函数的返回值来使用
 */

/**
 * 什么是高阶函数
 * 一个函数接收另一个函数作为参数，或者返回一个函数的情况称为高阶函数
 */

/**
 * 函数（Function）和方法（Method）的区别
 * 使用对象调用的函数，称为方法
 */

/**
 * JS数组常用的6个高阶函数
 * filter, map, reduce, find, findIndex, forEach
 */

/**
 * 组成闭包的2个部分，函数 + 可以访问的自由变量
 */

/**
 * 闭包定义的3点总结
 * 1.一个普通的函数，如果它可以访问外层作用域的自由变量时，称之为闭包
 * 2.广义上来说，JS中每个函数都是一个闭包
 * 3.狭义上来说，只有访问了外层作用域变量的函数，才称为闭包
 */

/**
 * 什么是闭包的内存泄漏
 * 闭包引用的外层作用域变量不会再使用，但无法释放的情况称为闭包的内存泄漏
 */

/**
 * 怎么解决闭包的内存泄漏问题
 * 将闭包的函数引用置为null，这样闭包函数关联的上层作用域AO对象将不可达，GC在下一次检测中，会将其释放。
 */

/**
 * 理解闭包的内存图
 */

/**
 * V8引擎的实现中，一个整数占据4个字节（ECMA规范中是8个，V8做了优化）
 */

/**
 * ECMA规范中闭包依赖的词法环境都不会销毁，V8引擎中删除了没有依赖的变量
 */
